package org.lanqiao.tjut.db;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.lanqiao.tjut.bean.TBAdminsBean;

public class DBTestDriver {

	public static void main(String[] args) {
		test06();
	}

	/**
	 * 基于jdbc的事务处理
	 * 
	 */
	private static void test06() {
		/*
		 * jdbc是的事务处理的流程：
		 * 获取connection对象：
		 * 打开事务：
		 *    // 设置connection对象的事务自动提交的属性为false
		 *    connection.setAuotCommit(fasle);
		 * 事务处理：
		 *    进行多表的事务处理；（进行多表数据库操作时要求全部使用设置了事务的connection对象）
		 * 进行提交或回滚：
		 *   // 提交事务
		 *   conn.commit();
		 *   // 回滚事务
		 *   conn.rollback(); 
		 * 
		 */
		// 获取事务处理驱动实体类对象(此步必须使用实例变量，因为后面的事务处理全部和该实例变量有关，保证后续的操作在同一个事务机制中)
		DBDriverWithTransaction dbdt = DBFactory.getDBDriverWithTransactionInstance();
		// 打开事务：
		dbdt.beginTransaction();
		// 开始多表的事务处理
		// 事务处理1：修改admin的密码
		String strSqlModify = "update tbadmins set admins_psw = ? where admins_id = ?";

		int iupate = dbdt.update(strSqlModify, "admin123", 2);
		// 验证当前操作已经完成
		// 组织数据查询操作sql语句
		String strSqlQuery = "select * from tbadmins where admins_name = 'admin'";
		TBAdminsBean tbAdminsB = dbdt.query(strSqlQuery, new BeanHandler<>(TBAdminsBean.class));
		System.out.println("update操作之后，当前数据库中的记录内容：" + tbAdminsB.toString());
		// 事务处理2：添加一条新的数据记录
		String strSql2 = "INSERT INTO TBADMINS(ADMINS_NAME,ADMINS_PSW) VALUES ( 'admin3','admin3')";
		int iInsert = dbdt.update(strSql2);
		// 根据业务逻辑判定事务处理是提交还是回滚
		// 事务提交或回滚处理
		if (iupate > 0 && iInsert > 0) {
			// 提交事务
			dbdt.commit();
		} else {
			// 回滚事务
			dbdt.rollback();
		}
		// 关闭资源
		dbdt.close();
		System.out.println("-------------------");

	}
}
